#pragma region  【算法5 - 4】图的深度优先遍历
int flag[N] = {0}; // N为图的顶点个数
void DFSTraverse(Graph *G, int v)
{ //从顶点v出发深度优先遍历图G
    Visited(v);
    flag[v] = 1; //访问顶点v，并置访问标记
    for (w = FirstAdjVex(G, v); w; w = NextAdjVex(G, v, w))
        if (!flag[w])
            DFSTraverse(G, w);
    //对顶点v的尚未访问的邻接顶点w递归调用DFSTraverse
}
#pragma endregion
//上面算法只是一个形式化的算法，算法5 - 5给出了对用邻接表存储的图进行深度优先遍历的过程。
#pragma region  【算法5 - 5】深度优先遍历邻接表存储的图 
int flag[N] = {0 }; //全局数组初始化为0
void DFS(VertexNode AdjList[], int i)
{ //以顶点i为出发点，对邻接表存储的图G进行DFS搜索
    EdgeNode *p;
    Visited(AdjList[i].vertex); //访问顶点vi
    flag[i] = 1;                //标记顶点i已访问
    p = AdjList[i].firstedge;   //取顶点i邻接边链表的头指针
    while (p)
    {
        j = p->adjvex; //依次搜索顶点i的邻接点顶点j
        if (!flag[j])
            DFS(AdjList, j); //若顶点j尚未访问，则以顶点j为出发点深度搜索
        p = p->next; //找顶点i的下一个邻接点
    }
}
void DFSTraverseAL(VertexNode AdjList[])
{ // AdjList是图G的邻接表，N是顶点个数，对图G进行深度优先遍历
    int i;
    for (i = 0; i < N; i++)
        if (!flag[i])
            DFS(AdjList, i); //若vi未访问过，从vi开始DFS搜索
}
#pragma endregion